iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0

在程式開發中,錯誤是無法避免的。
例如:

  • 使用者輸入的資料格式錯誤
  • 陣列取值超出範圍
  • 檔案不存在
  • 呼叫 API 失敗

如果沒有處理好,整個程式可能會直接中斷。
所以我們需要 例外處理 (Exception Handling),讓程式在遇到錯誤時能「優雅地處理」,而不是直接當掉。
https://ithelp.ithome.com.tw/upload/images/20250921/20121224UsWL13iygh.png

try-catch 基本結構

try
{
    int number = int.Parse("ABC"); // 嘗試把文字轉數字,會失敗
    Console.WriteLine(number);
}
catch (Exception ex)
{
    Console.WriteLine($"發生錯誤:{ex.Message}");
}

結果:

發生錯誤:輸入字串的格式不正確。

多個 catch 的使用

有時候需要針對不同類型的例外做不同處理。
例如:

try
{
    string input = null;
    Console.WriteLine(input.Length); // 會丟 NullReferenceException
}
catch (NullReferenceException ex)
{
    Console.WriteLine("物件尚未初始化,不能使用。");
}
catch (FormatException ex)
{
    Console.WriteLine("格式錯誤,無法轉換。");
}
catch (Exception ex)
{
    Console.WriteLine($"其他錯誤:{ex.Message}");
}

為什麼 Exception ex 要放在最後?

因為 Exception 是「所有例外的父類別」。

  • 如果先放 catch (Exception ex),它會攔住所有錯誤,後面的更精準的 catch 就不會執行。
  • 正確做法是:先處理特定例外,再處理通用的 Exception

finally 的用途

finally 代表「不管有沒有例外,一定會執行」。常用來釋放資源,例如關閉檔案、釋放連線。

try
{
    Console.WriteLine("開始計算");
    int x = 10 / 0; // 除以零錯誤
}
catch (DivideByZeroException)
{
    Console.WriteLine("不能除以零!");
}
finally
{
    Console.WriteLine("這段一定會執行,適合放清理程式碼。");
}

輸出:

開始計算
不能除以零!
這段一定會執行,適合放清理程式碼。

實戰:查詢股票價格

假設我們要從字典 Dictionary<string, decimal> 查股票價格。
如果輸入錯誤的股票代號,會發生 KeyNotFoundException

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary<string, decimal> prices = new Dictionary<string, decimal>
        {
            { "2330", 1265m },
            { "2303", 45.7m }
        };

        try
        {
            Console.WriteLine($"2330 價格:{prices["2330"]}");
            Console.WriteLine($"9999 價格:{prices["9999"]}"); // KeyNotFoundException
        }
        catch (KeyNotFoundException)
        {
            Console.WriteLine("查無此股票代號");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"其他錯誤:{ex.Message}");
        }
        finally
        {
            Console.WriteLine("查詢結束。");
        }
    }
}

什麼時候需要例外處理?

  • 輸入有風險:使用者輸入的字串可能無法轉換成數字。
  • 外部資源:檔案可能不存在、網路可能斷線。
  • 運算錯誤:除以零、索引超出範圍。

要記得:

  • 例外處理是「保護程式不當掉」的手段
  • 不是用來取代正常流程控制

小結

今天我們學會了:

  • try-catch 的基本用法
  • 多個 catch,而且 Exception ex 要放在最後
  • finally 適合放清理程式碼
  • 股票查詢的例外處理實戰


上一篇
Day 9 - LINQ 基礎:快速查詢資料
下一篇
Day 11 - 非同步程式設計 (async/await) 入門
系列文
30天快速上手製作WPF選股工具 — 從C#基礎到LiteDB與Web API整合21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言